package com.yc.spring.aop;

import com.yc.spring.bbs.dao.UserDao;
import com.yc.spring.bbs.dao.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//java官方提供的代理方式，基于接口方式实现，被代理类必须实现接口
public class JDKProxy {

    public static Object proxy(Object bean){
        //1.类加载器   2.允许多实现，所以接口数组  //3.方法拦截器
        return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(),
                new InvocationHandler() {

                    @Override
                    /**
                     * 代理对象  proxy
                     * 拦截到的方法 method
                     * 传入方法的参数  args
                     */
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //执行业务方法
                        System.out.println("前置增强 method  " + method);

                        Object ret = method.invoke(bean, args);
                        return ret;
                    }
                });
    }


    public static void main(String[] args) {
        UserDao userDao = new UserDaoImpl();
        UserDao proxy = (UserDao) proxy(userDao);
        proxy.insert(null);
    }

}
